'''
1、viewset种类：
    GenericViewSet：
    这是一个基础视图集，它本身不包含任何操作，但继承了 ViewSetMixin 和 GenericAPIView。
    开发者可以通过组合不同的 mixins（如 ListModelMixin, CreateModelMixin 等）来实现具体的操作。
    ReadOnlyModelViewSet：
    这是一个只读视图集，它实现了列表页和详情页的接口。
    它继承了 mixins.RetrieveModelMixin, mixins.ListModelMixin 和 GenericViewSet。
    ModelViewSet：
    这是一个完整的 CRUD（创建、读取、更新、删除）视图集。
    它继承了 mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin 和 GenericViewSet。
    通过这个视图集，开发者可以轻松地实现一个完整的模型资源操作接口。
2、mixin种类：
    ListModelMixin：
    提供 list 方法，用于快速实现返回数据列表的视图。
    该方法可以对数据进行过滤和分页。
    CreateModelMixin：
    提供 create 方法，用于快速实现创建资源的视图。
    该方法接收前端发送的数据，验证数据的有效性，并保存数据。
    RetrieveModelMixin：
    提供 retrieve 方法，用于快速实现返回一个存在的模型数据对象的视图。
    如果对象存在，则返回 200 状态码和对象数据；否则返回 404 状态码。
    UpdateModelMixin：
    提供 update 方法，用于快速实现更新数据对象的视图。
    该方法获取单个对象，通过序列化获取对象的序列化对象，判断序列化对象的有效性，并更新数据。
    DestroyModelMixin：
    提供 destroy 方法，用于快速实现删除数据对象的视图。
    该方法获取单个对象并删除它，然后返回 204 状态码表示删除成功。
'''


from snippets.models import Snippet
from snippets.serializers import SnippetSerializer, UserSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from rest_framework import permissions
from snippets.permissions import IsOwnerOrReadOnly
from rest_framework.decorators import api_view, action
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework import renderers
from rest_framework import viewsets


class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

    @action(detail=True, renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

    # def create(self, request, *args, **kwargs):
    #     request.data['code'] = request.data.pop('mycode', None)  # 弹出 'mycode' 并将其值赋给 'code'
    #     return super().create(request, *args, **kwargs)
    #
    # def update(self, request, *args, **kwargs):
    #     request.data['code'] = request.data.pop('mycode', None)  # 同样处理 PUT/PATCH 请求
    #     return super().update(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)



@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'snippets': reverse('snippet-list', request=request, format=format)
    })

# class SnippetList(generics.ListCreateAPIView):
#     queryset = Snippet.objects.all()
#     serializer_class = SnippetSerializer
#     permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
#
#     def printcontent(self):
#         print('user in snippet', self.request.content)
#
#     def perform_create(self, serializer):
#         serializer.save(owner=self.request.user)
#
# class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
#     queryset = Snippet.objects.all()
#     serializer_class = SnippetSerializer
#     permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

# class UserList(generics.ListAPIView):
#     queryset = User.objects.all()
#     serializer_class = UserSerializer
#
#     def printcontent(self):
#         print('user in snippet', self.request.content)
#
#
# class UserDetail(generics.RetrieveAPIView):
#     queryset = User.objects.all()
#     serializer_class = UserSerializer

# class SnippetHighlight(generics.GenericAPIView):
#     queryset = Snippet.objects.all()
#     renderer_classes = [renderers.StaticHTMLRenderer]
#
#     def get(self, request, *args, **kwargs):
#         snippet = self.get_object()
#         return Response(snippet.highlighted)

